三維幾何-三角形

三角形的有向面積的二倍。和二維情形一樣,注意求出叉積後要取長度。

​double Area2(const Vector3 &A,const Vector3 &B, const Point3 &C)
{
    return Length(Cross(B-A, C-A));
}

判斷點是否在三角形內。先判斷點是否在三角形所在平面上,然後利用簡單的面積關係即可。

這裏我們假定P在P0、P1和P2確定的平面上

bool PointInTri(const Point3 &P, const Point3 &P0, const Point3 &P1, const Point3 &P2)
{
    double area1, area2, area3;

    area1 = Area2(P, P0, P1);
    area2 = Area2(P, P2, P0);
    area3 = Area2(P, P1, P2);

    return (dcmp(area1+area2+area3 - Area2(P0, P1, P2)) == 0);
}

判斷線段是否和三角形相交。利用上面的函數不難得到。

bool TriSegIntersection(const Point3 &P0, const Point3 &P1, const Point3 &P2, const Point3 &A, const Point3 &B, Point3 &P)
{
    Vector3 n;
    double t;

    n = Cross(P1-P0, P2-P0);
    if(dcmp(Dot(B-A, n)) == 0)                 //線段AB和平面P0P1P2平行或共面
        return false;
    else                                       //平面A和直線P1-P2有唯一交點
    {
        t = Dot(n, P0-A) / Dot(n, B-A);
        if(dcmp(t) < 0 || dcmp(t-1) > 0)       //線段不在線段AB上
            return false;

        P = A + (B-A)*t;                       //計算交點
        return PointInTri(P, P0, P1, P2);      //判斷交點是否在三角形p0-p1-p2內
    }
}

判斷兩個三角形是否有公共點,三角形的內部,邊,頂點都算作三角形的一部分。

如果相交,那麼必然有一個三角形的一條邊經過另一個三角形的內部、邊上或者頂點。

bool TriTriIntersection(Point3 *T1, Point3 *T2)
{
    int i;
    Point3 P;

    for(i = 0; i < 3; i++)
    {
        if(TriSegIntersection(T1[0], T1[1], T1[2], T2[i], T2[(i+1)%3], P))
            return true;
        if(TriSegIntersection(T2[0], T2[1], T2[2], T1[i], T1[(i+1)%3], P))
            return true;
    }

    return false;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章